<?php
namespace Admin\Model;
use Think\Model;
class MenuModel extends  Model {
    //{$menu_name_require} 需要在语言包文件写入对应的提示
    protected $_validate=array(
        array('name','require','{%menu_name_require'),
        array('module_name','require','{%module_name_require'),
        array('controller_name','require','{%controller_name_require'),
        array('action_name','require','{%action_name_require'),
       
    );
    public $_auto=array(
      array('ordid'=>255),  
      array('display'=>1),  
      array('sys_set'=>0),  
      array('mods'=>0),  
    );
    //暂时不知道什么用处 猜测是等级 貌似是递归函数
    public function get_level($id,$array=array(),$i=0){
        foreach ($array as $n=>$value) {
            if($value['id']==$id){
                if($value['pid']=='0') return $i;
                $i++;
                return $this->get_level($value['pid'],$array,$i);
                
            }
        }
    }
    //控制台快捷菜单
    public function console_cache(){
        $where=array('often'=>1,'display'=>1);
        $where['mods']=array('neq',1);
        $menus=M('menu')->field('id,name,module_name,controller_name,action_name,data')->where($where)->order('ordid')->select();
        F('console_menu',$menus);
        return $menus;
    }
    
    //读取管理员角色下的 子菜单列表
    public function sub_menu_cache($pid=0){
        $db_pre=C('DB_PREFIX');
        $join=$db_pre.'menu m on m.id=' .$db_pre. 'admin_auth.menu_id';
        $where['m.mods']=array('neq',1);
        $where=array('role_id'=>session('admin.role_id'),'m.display'=>1,'m.pid'=>$pid);
        $menusdata=M('admin_auth')->join($join)->where($where)->order('m.ordid,m.id')
        ->getField('m.id,m.name,m.module_name,m.controller_name,m.action_name,m.menu_type,m.data,m.stat');
       //数组循环 
       foreach ($menusdata as $key=>$val){
           if($val['menu_type']){
               $menus['menu'][]=$val;
           }else{
               $menus['btn'][]=$val;
           }   
       }
      //快速缓存一下
      F("admin_menu/{$_SESSION['admin']['role_id']}/sub_menu_{$pid}",$menus);
      return $menus;
    }
    //读取管理员角色下 具有子菜单的可见菜单表
    public function auth_menu_cache(){
        $db_pre = C('DB_PREFIX');
        $where = array('role_id'=>$_SESSION['admin']['role_id'],'m.display'=>1);
        !APP_DEVELOPER && $where['m.mods'] = array('neq',1);
        $menuList = M('AdminAuth')->where($where)->join($db_pre . 'menu m ON m.id=' . $db_pre . 'admin_auth.menu_id')->order('m.ordid')->getfield('m.id,m.name');
        F("admin_menu/{$_SESSION['admin']['role_id']}/auth_menu",$menuList);
        return $menuList;
    }
    //读取所有的导航列表
    public  function menu_nav_cache(){
        $where=array('menu_type'=>1);
        $where['mods']=array('neq',1);
        $menus=$this->where($where)->getField("id,menu_type");
        F('menu_nav_list',$menus);
        return $menus;
    }
    //读取管理员角色 权限内容
 public function auth_cache(){
        //$this->group_auth();
        $db_pre = C('DB_PREFIX');
        $where = array('role_id'=>$_SESSION['admin']['role_id']);
        $where['m.mods'] = array('neq',1);
        $authData = M('AdminAuth')->field('m.id,m.pid,m.spid,m.module_name,m.controller_name,m.action_name,m.menu_type,m.log_cn')->where($where)->join($db_pre . 'menu m ON m.id=' . $db_pre . 'admin_auth.menu_id')->order('pid desc,id desc')->select();
        if(false === $menu_nav = F('menu_nav_list')) $menu_nav = $this->menu_nav_cache();

        foreach($authData as $key=>$val){
            $spid = explode('|',$val['spid']);
            //$authList[$val['module_name'].'_'.$val['controller_name'].'_'.$val['action_name']] = array('id'=>$spid[1] ? $spid[1] : $spid[0],'pid'=>$val['pid']==$spid[2] ? $val['pid'] : $spid[2],'log_cn'=>$val['log_cn']);
            $c = count($spid);
            if($c<=3){
                $pid = $id = $spid[1] ? $spid[1] : $spid[0];
                $isget = false;
            }else{
                for($i=$c-2;$i>=0;$i--){
                    if($menu_nav[$spid[$i]]){
                        $pid = $spid[$i];
                        $id = $spid[--$i];
                        break;
                    }
                }
                if($i == 0) $pid = $id = $spid[1] ? $spid[1] : $spid[0];
                $isget = $i >= 2 ? true : false;
            }
            $f = $isget ? '_isget' : '';
            !$authList[$val['module_name'].'_'.$val['controller_name'].'_'.$val['action_name'].$f] && $authList[$val['module_name'].'_'.$val['controller_name'].'_'.$val['action_name'].$f] = array('id'=>$id,'pid'=>$pid,'isget'=>$isget,'log_cn'=>$val['log_cn']);
        }
        F("admin_menu/{$_SESSION['admin']['role_id']}/auth",$authList);
        return $authList;
    }
    
    
    
    
    
    
    
    
    
    
    
    
  
}